package agent.componet.tool;

import dev.langchain4j.agent.tool.Tool;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@Component
public class FileTool {

    /**
     * 获取当前工作目录及其所有子目录的完整路径
     */
    @Tool(
            value = "获取当前程序运行目录下的所有目录（包括所有嵌套子目录）的完整路径。" +
                    "参数：无，无需传入任何参数。" +
                    "返回：字符串列表，每个元素为一个目录的绝对路径（如 'D:/project/src/main'）。" +
                    "用途：用于查询当前工作目录下的目录结构，适合需要遍历文件夹时调用。"
    )
    public  List<String> getDir() throws IOException {
        List<String> directories = new ArrayList<>();
        Path rootPath = Paths.get(System.getProperty("user.dir"));

        Files.walkFileTree(rootPath, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
                directories.add(dir.toString());
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
                return FileVisitResult.CONTINUE;
            }
        });

        return directories;
    }

    /**
     * 打开或创建文件并读取前1024字节内容
     */
    @Tool(
            value = "打开指定文件并读取其前1024字节内容；若文件不存在则自动创建该文件。" +
                    "参数：bookName（字符串类型），表示文件的名称或完整路径（如 'notes.txt' 或 'D:/docs/report.pdf'）。" +
                    "返回：文件前1024字节内容的字符串表示（字节数组转换为字符串）。" +
                    "注意：1. 若文件路径包含特殊字符（如空格），需确保路径格式正确；2. 仅返回前1024字节，大文件可能不完整。"
    )
    public  String openfile(String bookName) throws IOException {
        File file = new File(bookName);
        if (!file.exists()) {
            Files.createFile(Paths.get(bookName));
        }

        try (InputStream inputStream = new FileInputStream(file)) {
            byte[] read1024 = new byte[1024];
            int bytesRead = inputStream.read(read1024);
            // 处理实际读取的字节数（避免未填满的数组出现空字符）
            return bytesRead > 0 ? Arrays.toString(Arrays.copyOf(read1024, bytesRead)) : "文件为空";
        }
    }



}
